package com.atguigu.bigdata.scala.chapter08

object Scala02_Match {

    def main(args: Array[String]): Unit = {
        // TODO - 模式匹配
        // 模式匹配主要是根据规制进行匹配
        // TODO 匹配常量
//        val age = 20
//        age match {
//            case 10 => println("10")
//            case 20 => println("20")
//            case 30 => println("30")
//        }

//        def describe(x: Any) = x match {
//            case 5 => "Int five"
//            case "hello" => "String hello"
//            case true => "Boolean true"
//            case '+' => "Char +"
//        }
//
//        println(describe(5))

        // TODO 匹配类型
        // 此种场景下，case还起到了转换类型的概念，如果想要使用转换类型后的变量，那么需要声明变量
        def describe(x: Any) = x match {
            case i: Int => {
                i + 1
            }
            case s: String => "String hello"
            case m: List[String] => "List"
            case c: Array[Int] => "Array[Int]"
            case someThing => "something else " + someThing
        }

        println(describe(1))
        println(describe("1"))
        println(describe(Array(1,2,3,4)))
        println(describe(Array("1","2", "3", "4")))
        println(describe(List("1","2", "3", "4")))
        // TODO 模式匹配是不支持泛型的，泛型不起作用
        // 学习语法不仅仅要从代码中学习，还要从字节码中学习
        // scala源码编译后都是class字节码
        // Array[Int] 不是泛型，编译器会将Array[String]编译为 String[]
        // List<User>
        // Array的类型匹配比较特殊，需要单独来记。
        println(describe(List(1,2,3,4)))

    }
}
